# 1.加载CIFAR-10数据集，加载后返回训练集和测试集，每个集合包含图像数据和对应的标签
import numpy as np
from keras.datasets.cifar10 import load_data

# 2.将像素值标准化为[0, 1]区间，有助于模型训练过程中的数值稳定性和收敛速度
(x_train, y_train), (x_test, y_test) = load_data()
print(x_train.shape)
x_train = x_train / 255
x_test = x_test / 255

# 3.CIFAR-10数据集有10个类别，定义一个变量用于后续设置输出层的单元数
onehot_dim = len(np.unique(y_train))
from keras import Sequential, layers, losses, optimizers, activations

# 4.使用Sequential模型，这是一种线性堆叠的模型，你可以通过简单地添加层来构建模型
model = Sequential([
    # 5.第一层是卷积层
    layers.Conv2D(filters=6, kernel_size=(3, 3), activation=activations.relu),
    # 6.第二层是最大池化层
    layers.MaxPooling2D(),
    # 7.第三层是另一个卷积层
    layers.Conv2D(filters=6, kernel_size=(3, 3), activation=activations.relu),
    # 8.第四层是另一个最大池化层
    layers.MaxPooling2D(),
    # 9.第五层是Flatten层，用于将多维的输入一维化，以便输入到全连接层
    layers.Flatten(),
    # 10.第六层是全连接层，有64个神经元，激活函数为ReLU
    layers.Dense(units=64, activation=activations.relu),
    # 11.第七层是输出层，有10个神经元（对应10个类别），激活函数为softmax，用于多分类问题
    layers.Dense(units=onehot_dim, activation=activations.softmax)

])
# 12.编译模型
model.compile(optimizer=optimizers.Adam(), loss=losses.sparse_categorical_crossentropy, metrics='acc')
# 13.训练模型
model.fit(x_train, y_train, epochs=10, batch_size=128, validation_data=(x_test, y_test))
# 在测试集上评估模型
model.evaluate(x_test, y_test)
